#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Filename: code_summarize.py
# Author: ChenChangSong
# Date: 2025-08-24

"""
功能描述: 代码总结
"""
import os
import sys
import re

def remove_comments(code):
    """
    移除Python代码中的注释（包括单行注释和多行注释）
    """
    # # 移除多行注释（成对的三个单引号或三个双引号）
    # code = re.sub(r"(\'\'\'[\s\S]*?\'\'\'|\"\"\"[\s\S]*?\"\"\")", "", code)
    
    # # 移除单行注释（#开头的注释）
    # code = re.sub(r"#.*", "", code)
    
    # # 移除多余的空行
    # code = re.sub(r"\n\s*\n", "\n\n", code)
    
    return code.strip()

def summarize_python_code(root_path, ignore_files=None, ignore_dirs=None, remove_comments_flag=True):
    """
    遍历指定路径下的所有.py文件，将文件路径和代码内容输出到code_summarize.txt中
    
    参数:
    root_path (str): 要遍历的根目录路径
    ignore_files (list): 要忽略的文件名列表（如 ['__init__.py', 'setup.py']）
    ignore_dirs (list): 要忽略的目录名列表（如 ['venv', '__pycache__']）
    remove_comments_flag (bool): 是否移除代码注释
    """
    # 设置默认忽略列表
    if ignore_files is None:
        ignore_files = ['__init__.py']
    if ignore_dirs is None:
        ignore_dirs = ['__pycache__']
    
    # 检查路径是否存在
    if not os.path.exists(root_path):
        print(f"错误：路径 '{root_path}' 不存在")
        return
    
    # 确保输出文件使用绝对路径
    output_file = "code_summarize.txt"
    
    try:
        with open(output_file, 'w', encoding='utf-8') as outfile:
            # 遍历目录树
            for root, dirs, files in os.walk(root_path):
                # 跳过以点开头的目录（隐藏目录）
                dirs[:] = [d for d in dirs if not d.startswith('.')]
                
                # 跳过指定的忽略目录
                dirs[:] = [d for d in dirs if d not in ignore_dirs]
                
                for file in files:
                    # 只处理.py文件，跳过隐藏文件和忽略的文件
                    if (file.endswith('.py') and 
                        not file.startswith('.') and 
                        file not in ignore_files):
                        
                        file_path = os.path.join(root, file)
                        relative_path = os.path.relpath(file_path, root_path)
                        
                        try:
                            # 读取文件内容
                            with open(file_path, 'r', encoding='utf-8') as infile:
                                content = infile.read()
                            
                            # 如果需要，移除注释
                            if remove_comments_flag:
                                content = remove_comments(content)
                            
                            # 写入输出文件
                            outfile.write(f"文件路径：{relative_path}\n")
                            outfile.write("代码：\n")
                            outfile.write(content)
                            outfile.write("\n\n")  # 添加两个空行作为分隔
                            
                        except UnicodeDecodeError:
                            print(f"警告：文件 '{file_path}' 编码不是UTF-8，跳过")
                        except PermissionError:
                            print(f"警告：没有权限读取文件 '{file_path}'，跳过")
                        except Exception as e:
                            print(f"警告：读取文件 '{file_path}' 时出错: {e}，跳过")
        
        print(f"代码汇总完成！结果已保存到: {output_file}")
        
    except Exception as e:
        print(f"错误：写入输出文件时发生异常: {e}")


import os

def extract_codes_to_file(target_files, output_file, root_dir='.', ignore_dirs=None):
    """
    遍历指定目录及其子目录，查找多个指定的.py文件，并将其路径和内容输出到指定文件中
    
    Args:
        target_files (list): 要查找的目标.py文件名列表（如['main.py', 'utils.py', 'config.py']）
        output_file (str): 输出文件名（如'code_summarize.txt'）
        root_dir (str): 要遍历的根目录，默认为当前目录
        ignore_dirs (list): 要忽略的目录列表，默认为['venv', 'env', '.venv', 'migrations', 'tests']
    """
    # 设置默认忽略目录
    if ignore_dirs is None:
        custom_ignore_dirs = ['venv', 'env', '.venv', 'migrations', 'tests']
    else:
        custom_ignore_dirs = ignore_dirs
    
    # 确保target_files是列表类型
    if isinstance(target_files, str):
        target_files = [target_files]
    
    # 确保输出文件是.txt格式
    if not output_file.endswith('.txt'):
        output_file += '.txt'
    
    with open(output_file, 'w', encoding='utf-8') as out_f:
        # 记录找到的文件数量
        found_count = 0
        
        # 遍历指定目录及其所有子目录
        for root, dirs, files in os.walk(root_dir):
            # 从dirs列表中移除要忽略的目录，这样os.walk就不会遍历这些目录
            dirs[:] = [d for d in dirs if d not in custom_ignore_dirs]
            
            for file in files:
                if file in target_files:
                    file_path = os.path.join(root, file)
                    out_f.write(f"文件路径：{file_path}\n")
                    out_f.write("代码：\n")
                    try:
                        # 读取文件内容
                        with open(file_path, 'r', encoding='utf-8') as in_f:
                            content = in_f.read()
                            out_f.write(content)
                            out_f.write("\n\n")  # 添加空行分隔不同文件
                        found_count += 1
                    except Exception as e:
                        out_f.write(f"无法读取文件: {str(e)}\n\n")
        

    
    print(f"代码已提取到 {output_file}")
    print(f"共找到 {found_count} 个目标文件")
    print(f"忽略的目录: {', '.join(custom_ignore_dirs)}")


    





if __name__ == "__main__":
    path = r""
    
    # 自定义忽略列表
    custom_ignore_files = ['__init__.py', 'setup.py', 'config.py']
    custom_ignore_dirs = ['venv', 'env', '.venv', 'migrations', 'tests']
    
    # 指定多个查找的目标文件
    target_files = ['main.py', 'tapd_to_xmind_ui.py', 'get_tapd_case_dir.py']

    summarize_python_code(
        path, 
        ignore_files=custom_ignore_files,
        ignore_dirs=custom_ignore_dirs,
        remove_comments_flag=True  # 设置为True以移除注释
    )

    # 也可以指定特定目录
    # extract_codes_to_file(target_files, output_file='code_summarize.txt', root_dir=path)